package com.lzj.server.common.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationOutput;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.lzj.server.common.model.VideoRecommendModel;
import com.lzj.server.exceptions.BaseException;

import java.util.Arrays;
import java.util.List;

public class DashScopeGenerationServiceImpl {
    public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
        Generation gen = new Generation();
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("You are a video recommendation assistant. Your answers must always be JSON, concise, and structured.")
                .build();
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content("""
                        已知用户观看了标题：滑雪，标签：安全 的视频
                        请你根据以下要求返回结果，只能返回 JSON 格式，不能有多余的解释或其他内容。
                        
                        要求返回的数据结构如下：
                        [
                          { "videoId": 1, "score": 5, "recommend": true },
                          { "videoId": 2, "score": 2, "recommend": false }
                        ]
                        
                        这是候选视频列表：
                        1. videoId=11，标题：滑雪初体验，标签：滑雪 运动
                        2. videoId=12，标题：滑雪事故合集，标签：滑雪 安全
                        3. videoId=13，标题：滑雪教学，标签：滑雪 旅行
                        4. videoId=14，标题：吃饭，标签：雪糕 美食
                        5. videoId=15，标题：下雪，标签：风景 雨雪天
                        6. videoId=16，标题：看到外面下雪了，标签：下雪 景物
                        
                        请根据以下标准进行打分：
                        - related_score：表示与初学者滑雪经验分享的相关性（1-100分）
                        - recommend：是否推荐（true / false）
                        排序规则：
                        - related_score 降序
                        要求：
                        - 不要包含“以下是结果”之类的文字，你如果返回任何非 JSON 的内容，我会认为你失败了。
                        - 请你直接返回标准 JSON 字符串，不要任何代码块标记（```json）、不要多余换行符。
                        - 只返我能直接解析的标准JSON字符串，不要其他格式。
                        """)
                .build();
        GenerationParam param = GenerationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                // 此处以qwen-plus为例，可按需更换模型名称。模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .n(1) // 一次返回1条结果 防止多个Choice导致get(0)不规范
                .build();
        return gen.call(param);
    }

    public static void main(String[] args) {
        try {
            GenerationResult result = callWithMessage();
            List<GenerationOutput.Choice> choices = result.getOutput().getChoices();
            if (CollUtil.isNotEmpty(choices)) {
                System.out.println(JSONUtil.toList(JSONUtil.parseArray(choices.get(0).getMessage().getContent()), VideoRecommendModel.class));
            } else {
                throw new BaseException("No choices found in the generation result.");
            }
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            throw new BaseException(e.getMessage(), e);
        }
        System.exit(0);
    }
}
